Moq একটি জনপ্রিয় Mocking Framework, যা ASP.Net MVC এবং ASP.Net Core অ্যাপ্লিকেশনগুলোর জন্য Unit Testing এর সময় Dependency Mocking করতে ব্যবহৃত হয়। এটি টেস্ট ড্রাইভেন ডেভেলপমেন্ট (TDD)-এ সহায়ক এবং ডেভেলপারদের নির্দিষ্ট অংশের কোড টেস্ট করার জন্য অন্যান্য অংশের Dependency এর বাস্তবায়ন ছাড়া টেস্ট সম্পন্ন করতে দেয়।
Mocking Framework ব্যবহার করে অ্যাপ্লিকেশনের বিভিন্ন Dependency যেমন Service, Repository বা Database Context এর মক (Mock) অবজেক্ট তৈরি করা হয়। এটি টেস্টের সময় প্রকৃত ডেটার পরিবর্তে কাল্পনিক ডেটা সরবরাহ করে। এর ফলে কোড নির্ভরযোগ্য এবং দ্রুত টেস্ট করা যায়।
Moq Framework-এর বৈশিষ্ট্য:
Moq ব্যবহার করার জন্য NuGet থেকে Moq প্যাকেজটি ইন্সটল করতে হবে। Visual Studio-তে Package Manager Console থেকে কমান্ডটি রান করুন:
Install-Package Moq
ধরা যাক, আমাদের একটি ProductController আছে, যেটি একটি IProductService ইন্টারফেস ব্যবহার করে। Service টেস্ট করার জন্য Moq ব্যবহার করা হবে।
IProductService ইন্টারফেস:
public interface IProductService
{
IEnumerable<Product> GetAllProducts();
Product GetProductById(int id);
}
ProductController:
public class ProductController : Controller
{
private readonly IProductService _productService;
public ProductController(IProductService productService)
{
_productService = productService;
}
public IActionResult Index()
{
var products = _productService.GetAllProducts();
return View(products);
}
public IActionResult Details(int id)
{
var product = _productService.GetProductById(id);
if (product == null)
return NotFound();
return View(product);
}
}
নিচে ProductController এর Index
এবং Details
মেথড টেস্ট করার জন্য Moq ব্যবহার করা হয়েছে।
using Moq;
using Xunit;
public class ProductControllerTests
{
[Fact]
public void Index_ReturnsViewWithProducts()
{
// Arrange
var mockService = new Mock<IProductService>();
mockService.Setup(service => service.GetAllProducts()).Returns(new List<Product>
{
new Product { Id = 1, Name = "Product A" },
new Product { Id = 2, Name = "Product B" }
});
var controller = new ProductController(mockService.Object);
// Act
var result = controller.Index() as ViewResult;
// Assert
Assert.NotNull(result);
var products = result.Model as List<Product>;
Assert.Equal(2, products.Count);
Assert.Equal("Product A", products[0].Name);
}
[Fact]
public void Details_ReturnsNotFound_WhenProductDoesNotExist()
{
// Arrange
var mockService = new Mock<IProductService>();
mockService.Setup(service => service.GetProductById(It.IsAny<int>())).Returns((Product)null);
var controller = new ProductController(mockService.Object);
// Act
var result = controller.Details(1);
// Assert
Assert.IsType<NotFoundResult>(result);
}
[Fact]
public void Details_ReturnsViewWithProduct_WhenProductExists()
{
// Arrange
var mockService = new Mock<IProductService>();
mockService.Setup(service => service.GetProductById(1)).Returns(new Product { Id = 1, Name = "Product A" });
var controller = new ProductController(mockService.Object);
// Act
var result = controller.Details(1) as ViewResult;
// Assert
Assert.NotNull(result);
var product = result.Model as Product;
Assert.Equal(1, product.Id);
Assert.Equal("Product A", product.Name);
}
}
Verify মেথড দিয়ে নিশ্চিত করা যায় যে Service এর মেথড কতবার এবং কীভাবে ডাকা হয়েছে।
[Fact]
public void Index_CallsGetAllProductsOnce()
{
// Arrange
var mockService = new Mock<IProductService>();
mockService.Setup(service => service.GetAllProducts()).Returns(new List<Product>());
var controller = new ProductController(mockService.Object);
// Act
controller.Index();
// Assert
mockService.Verify(service => service.GetAllProducts(), Times.Once);
}
Moq Framework ব্যবহার করে ডিপেন্ডেন্সি মকিং করার মাধ্যমে ASP.Net MVC অ্যাপ্লিকেশনের Controller এবং Service টেস্ট করা সহজ এবং কার্যকর হয়। এটি টেস্টিং প্রক্রিয়াকে দ্রুততর করে এবং নির্ভরযোগ্য কোড তৈরি করতে সাহায্য করে। Mocking এবং Verify মেথডের কার্যকর ব্যবহার অ্যাপ্লিকেশনের লজিক এবং ডিপেন্ডেন্সি উভয়েরই নির্ভুলতা নিশ্চিত করে।
common.read_more